//
// Copyright (c) 2011 Alex Nesterenko
//

#include "nane/core/crt/POSIX/POSIXFileBase_.h"

#include <cassert>
#include <cstring>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    POSIXFileBase::POSIXFileBase( int _interface, const char* _filename )
        : SubSystemProductImpl<int>( _interface )
        , m_filename( NULL )
    {
        m_filename = new char[std::strlen(_filename)+1];
        std::strcpy(m_filename, _filename);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    POSIXFileBase::~POSIXFileBase()
    {
        delete[] m_filename;
        m_filename = NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 POSIXFileBase::tell()
    {
        assert( m_interface != -1 );
        return static_cast<uint32>(::lseek(m_interface, 0, SEEK_CUR));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void POSIXFileBase::seek( uint32 _pos )
    {
        // file must be opened
        assert( m_interface != -1 );
        ::lseek(m_interface, static_cast<off_t>(_pos), SEEK_SET);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 POSIXFileBase::size() const
    {
        assert( m_interface != -1 );
        uint32 size = 0;
        struct stat fst;
        if( ::stat(m_filename, &fst) == 0 )
        {
            size = static_cast<uint32>(fst.st_size);
        }
        return size;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
